package com.ywq.train;

/*import com.ywq.train.AppConfig;
import com.ywq.train.service.OrderService;*/
import com.ywq.train.service.UserService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test {


    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
// bean
        //拿到的是userService的一个代理对象，OrderService是没有值的

        UserService userService = applicationContext. getBean("userService", UserService.class);
        userService.test2();
/*
        单例bean：多处调用bean的同一个名字,是同一个对象  原型bean则不是同一个对象
        单例bean的底层实现,是 Map<beanName,bean对象>  是spring容器
        先byType再byName
        Map<orderService, OrderService对象>
        Map<orderService1, OrderService对象>
        Map<orderService2, OrderService对象>      */
        System.out.println(applicationContext.getBean("orderService"));
        System.out.println(applicationContext.getBean("orderService"));
        System.out.println(applicationContext.getBean("orderService"));
        System.out.println(applicationContext.getBean("orderService1"));
        System.out.println(applicationContext.getBean("orderService2"));

       /*
       Bean的创建生命周期
        Bean--->对象
        UserService类- -- - >无参构造方法(实例化)推断构造方法---->对象-----依赖注----- >初始化前(@PostConstruct) ->初始化(InitializingBean)-->初始化后(AOP) -- >bean
            判断是否实现InitializingBean接口使用 instanceof 方法
            初始化后要判断对象是否需要aop(aop对于切的那个类如果实现了某个接口使用jdk,如果没有实现接口使用cjlib,cjlib是通过父子类实现的)
            1.判断
            找到所有的切面bean    遍历  @Aspect注解-->看@beafore---->与普通对象是否匹配
                               缓存  method  执行代理对象的test()方法时 再拿出来 直接调用

            2.
            生成代理类 子类  切面
            class UserServiceProxy extends UserService{
               private UserService Target;
                public void test(){
                //执行切面逻辑(before)
                //执行业务逻辑           不是使用super.test()实现父类的代码，可能造成变量拿不到值得情况
                //实现方式是  在代理类里面去 加一个属性Target  执行target.test(); 即上面流程第三步骤，对象的值

                }
            }


            事务
            public void test(){
            //有没有注解@Tran
            开启事务
                事务管理器 去建立数据库conn链接  dataSourse
                修改 conn.setAutocommit(false)   这个值默认是true 就是自动提交  执行完就提交 ，再做异常已经没有效果了
                执行业务逻辑 traget.test();
                conn.commit()手动提交事务

            }

 ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
首先，java 中的instanceof是一个运算符，而且是二目运算符，即有两个操作数。该运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出，这个对象是否是这个特定类或者是它的子类的一个实例。
 用法：
result = object instanceof class
参数：
Result：布尔类型。
Object：必选项。任意对象表达式。
Class：必选项。任意已定义的对象类。
说明：
如果 object 是 class 的一个实例，则 instanceof 运算符返回 true。如果 object 不是指定类的一个实例，或者 object 是 null，则返回 false。

2. 举例说明如下：

例子如下：

interface A{}
 class B implements A{
 }
 class C extends B {
 }
对于以上代码，测试结果分析如下：

     boolean res;
     A a=null;
     B b=null;

     res = a instanceof A; //因为a是null，所以结果为false
     res = b instanceof B; //因为b是null，所以结果为false

     a=new B();

     res = a instanceof A; //因为a是B类型的实例，B又是A的一个实现类，所以结果为true
     res = a instanceof B; //因为a是B类型的实例，所以结果为true

   ——————————————————————————————————————————————————————————————————————————————————————————————




       for (Method method : userService.getClass ().getMethods()) {
            if (method.isAnnotationPresent (PostConstruct.class)) {
                method.invoke (userService, xxxxx);
            }
        }


        */


    }
}
/*

di的六个步骤
    byType
        根据Type从Spring容器找到多个Bean
                (通过一系列筛选逻辑)
                是不是isAutowireCandidate
                    是不是符合Qualifier
                        取@Primary标注了的Bean
                            取优先级最高的Bean
                                根据属性名字选出一个
 */